home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / amos / intuiextend16.lha / bonus / easylife / demos / VarChecker.AMOS / VarChecker.amosSourceCode
AMOS Source Code  |  1992-02-26  |  17KB  |  541 lines

  1. '****************************************************************************
  2. '**      Variable Checker V1.0  -  By Paul Hickman (ph@doc.ic.ac.uk)       **
  3. '**                                                                        **
  4. '**  Requires AMOS Pro & Easylife V1.4+   Distributed as an easylife demo  **
  5. '****************************************************************************
  6. Set Accessory 
  7.  
  8. '
  9. 'MXVARS is the maximum number of variable names in your program
  10. 'NUMCOMMANDS is the number of commands which may be confused with  
  11. 'variable names (See Line 34).   
  12. '
  13. Set Buffer 80
  14. MXVARS=300 : NUMCOMMANDS=6
  15. '
  16.  
  17. Dim NAME$(MXVARS,1),NAME(MXVARS,4),TYPE$(4),COMMAND$(NUMCOMMANDS)
  18. Global AL$,NAME$(),NAME(),LAST,GLO,SHA,LOC,FLP,COMMAND$()
  19. 'NAME(N,0)=Type (See Below)
  20. 'NAME(N,1)=Number of local uses. 
  21. 'NAME(N,2)=Number of global assignments.   
  22. 'NAME(N,3)=Number of global references.  
  23. 'NAME(N,4)=Line Number of definition.  
  24. '
  25. GLO=1 : TYPE$(1)="Global"
  26. SHA=2 : TYPE$(2)="Shared"
  27. LOC=3 : TYPE$(3)="Local"
  28. FLP=4 : TYPE$(4)="For Loop"
  29. LAST=0
  30.  
  31. For A=1 To NUMCOMMANDS : Read COMMAND$(A) : Next 
  32.  
  33. '************************************************************************  
  34. 'These are the commands to ignore - Set NUMCOMANDS at the top of the code
  35. 'to the number of them.
  36.  
  37. Data "Scene X","Scene Y","Imouse X","Imouse Y","Jd Char X","Jd Char Y"
  38.  
  39. '************************************************************************
  40.  
  41. INIT_SCREEN
  42.  
  43. ' Make sure we are an accessory
  44. If Prg Under<>1
  45.    If Exist("VarChecker.Doc")
  46.       Read Text "VarChecker.Doc"
  47.    Else 
  48.       NULL=Dialog Box(AL$,1,"This program must be run as an accessory!")
  49.    End If 
  50.    MN_QUIT
  51. End If 
  52.  
  53. ' Initialise Program Listing 
  54. '  
  55. TITLE
  56. Clear Key 
  57.  
  58. ' Open all procedures  
  59. Call Editor 89 : Rem Equ("AEd_UnfoldAll") 
  60.  
  61. ' Ask number of lines
  62. Ask Editor 5 : NLINES=Param : Rem Equ("AEdAsk_NumberOfLines")  
  63.  
  64. ' Top of text
  65. Call Editor 17 : RemEqu("AEd_TopOfText")
  66.  
  67. SCOPE$="MAIN PROGRAM"
  68. For N=1 To NLINES
  69.    Ask Editor 1,N : LINE$=Param$ : Rem Equ("AEdAsk_CurrentLine")
  70.    SP= Extension_16_00C8(LINE$,32)
  71.    LINE$=Mid$(LINE$,SP)
  72.    If Left$(LINE$,7)="Shared "
  73.       _DECLARE[Mid$(LINE$,8),SCOPE$,SHA,N,False]
  74.    End If 
  75. Next 
  76.  
  77. For N=1 To NLINES
  78.    
  79.    'Read the current line 
  80.    
  81.    Ask Editor 1,N : LINE$=Param$ : Rem Equ("AEdAsk_CurrentLine")
  82.    
  83.    'Ignore whole line comments
  84.    
  85.    SP= Extension_16_00C8(LINE$,32)
  86.    LINE$=Mid$(LINE$,SP)
  87.    If(SP>0) and(Asc(LINE$)<>39)
  88.       
  89.       'Replace all quoted strings with 0.
  90.       
  91.       Repeat 
  92.          A1= Extension_16_00AA(LINE$,"'") : If A1=0 : A1=Len(LINE$)+1 : End If 
  93.          A2= Extension_16_00AA(LINE$,'"') : If A2=0 : A2=Len(LINE$)+1 : End If 
  94.          A=Min(A1,A2)
  95.          If A<Len(LINE$)+1
  96.             If A=A1
  97.                AA= Extension_16_00BC(LINE$,"'",A)
  98.             Else 
  99.                AA= Extension_16_00BC(LINE$,'"',A)
  100.             End If 
  101.             If AA
  102.                LINE$=Left$(LINE$,A-1)+"0"+Mid$(LINE$,AA+1)
  103.             Else 
  104.                LINE$=Left$(LINE$,A-1)
  105.             End If 
  106.          End If 
  107.       Until A=Len(LINE$)+1
  108.       
  109.       'Check for procedure definition      
  110.       
  111.       If Left$(Upper$(LINE$),9)="PROCEDURE"
  112.          
  113.          'Get procedure name for scope of local variables 
  114.          
  115.          P= Extension_16_008C(LINE$,91)
  116.          If P
  117.             SCOPE$=Mid$(LINE$,11,P-11)
  118.          Else 
  119.             SCOPE$=Mid$(LINE$,11)
  120.          End If 
  121.          
  122.          'Record declaration of parameters as local variables 
  123.          
  124.          _DECLARE[Mid$(LINE$,P+1,Len(LINE$)-P-1),SCOPE$,LOC,N,False]
  125.          
  126.          
  127.          
  128.       Else If Left$(LINE$,8)="End Proc"
  129.          
  130.          'Pass End Proc's argument string for references
  131.          
  132.          If Mid$(LINE$,9,1)="["
  133.             PARSE_ARGS[Mid$(LINE$,10,Len(LINE$)-10),SCOPE$,False,N]
  134.          End If 
  135.          
  136.          'Scan for local variables/parameters were not refered to, and
  137.          'shared variables that were not refered to, or set to a value. 
  138.          
  139.          A=0 : While A<LAST
  140.             If NAME$(A,1)=SCOPE$
  141.                If NAME(A,1)=0
  142.                   If NAME(A,0)=LOC
  143.                      'Allow NULL to be unreferenced 
  144.                      If(NAME$(A,0)<>"NULL") and(NAME$(A,0)<>"NULL#") and(NAME$(A,0)<>"NULL$")
  145.                         DLOG["Unreferenced Local Variable: "+NAME$(A,0)]
  146.                      End If 
  147.                   Else 
  148.                      If NAME(A,0)=SHA
  149.                         DLOG["Unused Shared Variable: "+NAME$(A,0)]
  150.                      End If 
  151.                   End If 
  152.                End If 
  153.                If NAME(A,0)>=LOC
  154.                   'Remove all local/for loop variables from array  
  155.                   For AA=A To LAST+1
  156.                      For XX=0 To 4 : NAME(AA,XX)=NAME(AA+1,XX) : Next 
  157.                      NAME$(AA,0)=NAME$(AA+1,0)
  158.                      NAME$(AA,1)=NAME$(AA+1,1)
  159.                   Next 
  160.                   Dec LAST
  161.                Else 
  162.                   NAME(A,1)=0
  163.                   Inc A
  164.                End If 
  165.             Else 
  166.                Inc A
  167.             End If 
  168.          Wend 
  169.          
  170.          'Change scope to outside procedure 
  171.          
  172.          SCOPE$="MAIN PROGRAM"
  173.          
  174.          
  175.          
  176.          
  177.       Else If Left$(LINE$,7)="Shared "
  178.          'Record declaration of shared variables
  179.          _DECLARE[Mid$(LINE$,8),SCOPE$,SHA,N,False]
  180.          
  181.       Else If Left$(LINE$,7)="Global "
  182.          'Record declaratino of global variables
  183.          _DECLARE[Mid$(LINE$,8),SCOPE$,GLO,N,False]
  184.          
  185.       Else 
  186.          'Splitup the line into it's statements, and parse each in turn.
  187.          
  188.          While LINE$<>""
  189.             Exit If Left$(LINE$,4)="Rem "
  190.             SEP= Extension_16_00AA(LINE$,":")
  191.             If SEP
  192.                STATE$=Left$(LINE$,SEP-2)
  193.                LINE$=Mid$(LINE$,SEP+2)
  194.             Else 
  195.                STATE$=LINE$ : LINE$=""
  196.             End If 
  197.             '
  198.             PARSE_STAT[STATE$,N,False]
  199.          Wend 
  200.          
  201.       End If 
  202.    End If 
  203.    
  204.    'Move to the next line of program source.
  205.    
  206.    Call Editor 2 : Rem Equ("AEd_Down")
  207.    
  208. Next 
  209.  
  210. For A=0 To LAST
  211.    If(NAME$(A,0)<>"") and(NAME(A,0)<>FLP) and(NAME$(A,0)<>"NULL") and(NAME$(A,0)<>"NULL#") and(NAME$(A,0)<>"NULL$")
  212.       If(NAME(A,2)=0) and(NAME(A,3)=0)
  213.          Call Editor 76,NAME(A,4)
  214.          DLOG["Unused "+TYPE$(NAME(A,0))+" Variable: "+NAME$(A,0)]
  215.       Else If(NAME(A,2)=0) and(NAME(A,0)<>LOC)
  216.          Call Editor 76,NAME(A,4)
  217.          DLOG["Undefined "+TYPE$(NAME(A,0))+" Variable: "+NAME$(A,0)]
  218.       Else If NAME(A,3)=0
  219.          Call Editor 76,NAME(A,4)
  220.          T$=TYPE$(NAME(A,0))
  221.          If(NAME(A,0)=LOC) and(NAME$(A,1)="MAIN PROGRAM") : T$="Main Program" : End If 
  222.          DLOG["Unreferenced "+T$+" Variable: "+NAME$(A,0)]
  223.       End If 
  224.    End If 
  225. Next 
  226. NULL=Dialog Box(AL$,1,"Scan completed. No more undeclared or unreferenced variables")
  227. MN_QUIT
  228.  
  229. Procedure INIT_SCREEN
  230.    
  231.    'Generates code to draw requesters.
  232.    
  233.    Restore ALT
  234.    Repeat 
  235.       Read A$ : AL$=AL$+A$
  236.    Until A$=""
  237.    For A=1 To 7 : Trap Screen Close A : Next 
  238.    Resource Screen Open 0,640,40,0
  239.    Curs Off : Flash Off : Cls 0
  240.    Screen Display 0,,60,,
  241.    Wait Vbl 
  242.    
  243.    Paper 0 : Pen 1
  244.    Pop Proc
  245.    
  246.    ' QUICK RUN DIALOG BOXES 
  247.    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  248.    ALT: Data " "
  249.    ' One button, CANCEL 
  250.    ' ~~~~~~~~~~~~~~~~~~ 
  251.    Data "SIze   SW,SH;"
  252.    Data "BAse   SWidth SX -2/,SHeight SY- 2/;"
  253.    Data "IF     0VA 0=;"
  254.    Data "["
  255.    Data "BOx    0,0,1,SX,SY;"
  256.    Data "POut   1VACX,16,1VA,0,7;"
  257.    Data "BU 0,0,0,SX,SY,0,0,0;[][SM;]"
  258.    Data "]"
  259.    Data "IF     0VA 1=;"
  260.    Data "["
  261.    Data "BOx    0,0,1,SX,SY;"
  262.    Data "POut   1VACX,8,1VA,0,7;"
  263.    Data "BU 1,SX112-,SY16-,96,16,0,0,1;[LI 0,0,41BP3*+,SX;PR 'Quit' CXBP+,1,'Quit',7;][BR0;BQ;]"
  264.    Data "KY 27,0;"
  265.    Data "BU 0,0,0,SX,SY,0,0,0;[][SM;]"
  266.    Data "RUn    0,3;"
  267.    Data "]"
  268.    Data "IF     0VA 2=;"
  269.    Data "["
  270.    Data "BOx    0,0,1,SX,SY;"
  271.    Data "POut   1VACX,8,1VA,0,7;"
  272.    Data "BU 1,16,SY16-,96,16,0,0,1;[LI 0,0,41BP3*+,SX;PR 'Continue'CXBP+,1,'Continue',7;][BR0;BQ;]"
  273.    Data "KY 13,0;"
  274.    Data "BU 2,SX112-,SY16-,96,16,0,0,1;[LI 0,0,41BP3*+,SX